#ifndef __WIZ_BASE_MPL_BYTES_REVERSE_HPP__SHANHAOBO_19800429__
#define __WIZ_BASE_MPL_BYTES_REVERSE_HPP__SHANHAOBO_19800429__

#include "../Type/WizBaseTypeByte.hpp"

namespace Wiz
{
    namespace MPL
    {
        /// One Param
        template<int N>
        WIZ_INLINE ::Wiz::Void::Type ByteReverse(::Wiz::Byte::InOutPtr IOVal)
        {
            ::Wiz::Swap(*IOVal, *(IOVal + N - 1));
            ::Wiz::MPL::ByteReverse<N - 2>(IOVal + 1);
        }

        template<>
        WIZ_INLINE ::Wiz::Void::Type ByteReverse<1>(::Wiz::Byte::InOutPtr IOVal)
        {
        }
        template<>
        WIZ_INLINE ::Wiz::Void::Type ByteReverse<0>(::Wiz::Byte::InOutPtr IOVal)
        {
        }

        /// Two Param
        template<int N>
        WIZ_INLINE ::Wiz::Void::Type ByteReverse(::Wiz::Byte::InPtr IVal, ::Wiz::Byte::OutPtr OVal)
        {
            OVal[N - 1] = IVal[0];
            OVal[0] = IVal[N - 1];
            ::Wiz::MPL::ByteReverse<N - 2>(IVal + 1, OVal + 1);
        }

        template<>
        WIZ_INLINE ::Wiz::Void::Type ByteReverse<1>(::Wiz::Byte::InPtr IVal, ::Wiz::Byte::OutPtr OVal)
        {
        }
        template<>
        WIZ_INLINE ::Wiz::Void::Type ByteReverse<0>(::Wiz::Byte::InPtr IVal, ::Wiz::Byte::OutPtr OVal)
        {
        }
    } /// end of namespace MPL
} /// end of namespace Wiz

#endif /*__WIZ_BASE_MPL_BYTES_REVERSE_HPP__SHANHAOBO_19800429__*/
